#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

// int main()
// {
//     string s1;
//     string s2("Hello World");
//     //三种遍历方式
//     //1.for循环
//     for(size_t i = 0; i < s2.size(); i++)
//     {
//         cout << s2[i] << " ";
//     }
//     cout << endl;

//     //2.iterator 迭代器
//     string::iterator it = s2.begin();
//     while(it != s2.end())
//     {
//         cout << *it << " ";
//         ++it;
//     }
//     cout << endl;

//     //3.范围for 底层也是迭代器iterator
//     //特点：自动赋值，自动迭代，自动判断结束
//     for(auto ch : s2) // auto为自动推导类型
//     {
//         cout << ch << " ";
//     }
//     cout << endl;


//     int a = 1;
//     auto b = a;
//     cout << typeid(b).name() << endl;

//     return 0;
// }

// int main()
// {
//     string s1;
//     string s2("Hello World");
//     //1、正向迭代器
//     string::iterator it = s2.begin();
//     while(it != s2.end())
//     {
//         cout << *it << " ";
//         ++it;
//     }
//     cout << endl;

//     //2、逆向迭代器
//     string::reverse_iterator rit = s2.rbegin();
//     while(rit != s2.rend())
//     {
//         cout << *rit << " ";
//         ++rit;
//     }
//     cout << endl;

//     const string s3("Hello World");
//     //3、const 修饰迭代器
//     string::const_iterator cit = s3.begin();
//     while(cit != s3.end())
//     {
//         cout << *cit << " ";
//         ++cit;
//     }
//     cout << endl;

//     //4、 const 逆向迭代器
//     //string::const_reverse_iterator crit = s3.rbegin();
//     auto crit = s3.rbegin();
//     while(crit != s3.rend())
//     {
//         cout << *crit << " ";
//         ++crit;
//     }
//     cout << endl;
// }

// int haha()
// {
//     string str;
//     cin >> str;
//     reverse(str.begin(), str.end());
//     int count = 0;
//     for(int i = 0; i < str.size() ; i++)
//     {
//         if(str[i] == ' ')
//         {
//             break;
//         }
//         count++;
//     }
//     return count;
// }
// int main() 
// {
//     cout << haha();
//     return 0;
// }

// int main()
// {
//     char ch = 'A';
//     ch += 32;
//     printf("%c", ch);
//     return 0;
// }

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Test

// void PushBack()
// {
//     //reverse 反转、逆置
//     //rerservs 保留、预留
//     string s;
//     //提前开空间，避免扩容
//     // s.reserve(100);
//     size_t sz = s.capacity();
//     cout << "capacity now: " << sz << endl;
//     for(size_t i = 0; i < 100; i++)
//     {
//         //尾插
//         s.push_back('c');
//         if(sz != s.capacity())
//         {
//             sz = s.capacity();
//             cout << "capacity changed: " << sz << endl;
//         }
//     } 
// }


// void TestString1()
// {
//     //试验出:g++坚定的缩容
//     string s("Hello World xxxxxxxxxxxxxxxxxxxxxxxx");
//     s.reserve(50);
//     cout << s.size() << endl;
//     cout << s.capacity() << endl << endl;

//     s.reserve(40);
//     cout << s.size() << endl;
//     cout << s.capacity() << endl << endl;

//     s.reserve(20);
//     cout << s.size() << endl;
//     cout << s.capacity() << endl << endl;

//     s.reserve(60);
//     cout << s.size() << endl;
//     cout << s.capacity() << endl << endl;

//     s += ('0' + 5);

//     reverse(s.begin(), s.end());
//     for(auto ch : s)
//     {
//         cout << ch << " ";
//     }
//     cout << endl << endl;

//     s.clear(); //清理数据不缩capacity
//     cout << s.size() << endl;
//     cout << s.capacity() << endl << endl;

// }

// void TestString2()
// {
//     //在第几个位置之前插入
//     string s1("Hello Bit");
//     s1.insert(0, "zzz ");
//     //插入单个字符 1 、
//     s1.insert(6, "s");
//     cout << s1 << endl;
//     //2、
//     char c = 'b';
//     s1.insert(7, 1, c);
//     cout << s1 << endl;
//     //3、迭代器
//     s1.insert(s1.begin(), '6');
//     cout << s1 << endl;

//     //删除
//     //1.给出目标位置与长度，长度不给默认npos 目标位置后全删
//     s1.erase(0, 4);
//     cout << s1 << endl;
//     //迭代器
//     s1.erase(s1.begin());
//     cout << s1 << endl;
//     //迭代器起始位置与末尾位置
//     s1.erase(s1.begin(), s1.end() - 1);
//     cout << s1 << endl;

//     //代替
//     string s2("Hello Bit");
//     string str("111111111");
//     s2.replace(0, 1, str);
//     cout << s2 << endl;
//     s2.replace(12, 2, str, 1, 1);
//     cout << s2 << endl;
//     string s3("Hello World");
//     s3.replace(s3.begin(), s3.end(), str);
//     cout << s3 << endl;

//     //swap
//     s3.swap(s2);
//     cout << s3 << endl;

//     //c_str 把string类型转化为字符串char类型，适应c语言
//     string file;
//     cin >> file;
//     FILE* fout = fopen(file, "r");
//     if(fout == NULL)
//     {
//         perror("fopen fail!");
//         exit(1);
//     }
//     char ch = fgetc(fout);
//     while(ch != EOF)
//     {
//         cout << ch;
//         ch = fgetc(fout);
//     }
//     fclose(fout);
// }


// void SplitFilename (const string& str)
// {
//     cout << "Split:" << str << endl;
//     size_t found2 = str.find_last_of("\\/");
//     cout << "path:" << str.substr(0, found2) << endl;
//     cout << "flie:" << str.substr(found2 + 1) << endl;
// }

// void TestString3()
// {
//     //从前查找记录位置
//     string s("test.cpp");
//     size_t pos = s.find('.');
//     string buffix = s.substr(pos);
//     cout << buffix << endl;

//     //从后查找记录位置
//     string s1("text.zip.haha.cpp");
//     size_t pos1 = s1.rfind('.');
//     string buffix1 = s1.substr(pos1);
//     cout << buffix1 << endl;

//     //从前查找给定字符串中的任意一个字符并返回其位置  
//     string s2("Please, replace the vowels in this sentence by asterisks.");
//     cout << s2 << endl;
//     size_t found = s2.find_first_of("abcd");
//     while(found != string::npos)
//     {
//         s2[found] = '#';
//         found = s2.find_first_of("abcd", found + 1);
//     }
//     cout << s2 << endl;

//     string s3("Please, replace the vowels in this sentence by asterisks.");
//     size_t found1 = s3.find_first_not_of("abcd");
//     while(found1 != string::npos)
//     {
//         s3[found1] = '#';
//         found1 = s3.find_first_not_of("abcd", found1 + 1);
//     }
//     cout << s3 << endl;

//     //find_last_of 即从后查找   -- 运用 -- 分离路径与文件名
//     string str1 ("/usr/bin/man");  // linux
//     string str2 ("c:\\windows\\winhelp.exe"); // windows 一个\会被转义两个\\转义成一个\

//     SplitFilename(str1);
//     SplitFilename(str2);

//     //getline  遇到空格继续 遇到换行才停止
//     string s4;
//     getline(cin, s4);
//     cout << s4 << endl;
//     //geline 可以自己定义终止符
//     string s5;
//     getline(cin, s5, '*'); // 此时遇到换行也不会停止
//     cout << s5 << endl;
// }

// int main()
// {
//     // PushBack();
//     // TestString1();
//     // TestString2();
//     TestString3();

//     return 0;
// }
///////////////////////////////////////////////////////////////////////////////////////////////////////////
//打印字符串
// int main(int argc, char *argv[])

// {

// 	string strText = "How are you?";

// 	string strSeparator = " ";

// 	string strResult;

// 	int size_pos = 0;

// 	int size_prev_pos = 0;

// 	while((size_pos=strText.find_first_of(strSeparator, size_pos)) != string::npos)

// 	{

// 		strResult = strText.substr(size_prev_pos, size_pos-size_prev_pos);

// 		cout<<strResult<<" ";

// 		size_prev_pos = ++size_pos;

// 	}

// 	if(size_prev_pos != strText.size())

// 	{

// 		strResult = strText.substr(size_prev_pos, size_pos-size_prev_pos);

// 		cout<<strResult<<" ";

// 	}

// 	cout<<endl;

// 	return 0;

// }


// //模拟实现string
#include "String11.h"
namespace lmr
{
    void string_test()
    {
        string s("haha");
        cout << s << endl;
        s += "sss";
        s += 's';
        cout << s << endl;
        cout << s.size() << " " << s.capacity() <<  endl;
        s.insert(2, "sss");
        cout << s << endl;
        s.insert(5, '*');
        cout << s << endl;

        s.erase(2);
        cout << s << endl;

        string s1("test.cpp");
        size_t pos = s1.find('.');
        string buffix = s1.substr(pos);
        cout << buffix << endl;   
    }

    void string_test1()
    {
        string s("Hello World");
        string s2("ss");
        bool sign = s2 == s;
        if(sign == true)
        {
            // cin >> s;
            getline(cin, s);
            cout << s << endl;
            string s3;
            cin >> s3;
            cout << s3 << endl;
        }
    }

}

int main()
{
    lmr::string_test1();
    return 0;
}
